package showgo.gui;

import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

import showgo.modell.stueck.Absatz;
import showgo.modell.stueck.Rede;
import showgo.modell.stueck.Regieanweisung;
import showgo.modell.stueck.Text;

public class StueckTableModel extends AbstractTableModel {

    /**
     * 
     */
    private static final long serialVersionUID = -8710190734639866581L;

    private List<Absatz> absaetze = new ArrayList<Absatz>();

    public List<Absatz> getAbsaetze() {
	return absaetze;
    }

    Class<?>[] types = new Class[] { java.lang.String.class,
	    java.lang.String.class };

    @Override
    public int getColumnCount() {
	return 2;
    }

    @Override
    public int getRowCount() {
	return absaetze.size();
    }

    @Override
    public Object getValueAt(int row, int column) {
	switch (column) {
	case 0:
	    if (absaetze.get(row).getAbsatzID().equals("Regieanweisung")) {
		return "Regieanweisung";
	    } else {
		Rede rede = (Rede) absaetze.get(row);
		return rede.getRollenName();
	    }
	case 1:
	    if (absaetze.get(row).getAbsatzID().equals("Regieanweisung")) {
		Regieanweisung regie = (Regieanweisung) absaetze.get(row);
		return regie.getAnweisung();
	    } else {
		Rede rede = (Rede) absaetze.get(row);
		return rede.getText().toString();
	    }
	default:
	    return "";
	}
    }

    public void setValueAt(Object value, int row, int column) {
	if (absaetze.get(row).getAbsatzID().equals("Regieanweisung")) {
	    Regieanweisung regie = (Regieanweisung) absaetze.get(row);

	    switch (column) {
	    case 0:
		regie.setAbsatzID("Regieanweisung");
		break;
	    case 1:
		regie.setAnweisung((String) value);
		break;
	    }
	    fireTableCellUpdated(row, column);
	} else {
	    Rede rede = (Rede) absaetze.get(row);
	    switch (column) {
	    case 0:
		rede.setRollenName((String) value);
		break;
	    case 1:
		rede.setText(new Text((String) value));
		break;
	    }
	    fireTableCellUpdated(row, column);
	}
    }

    @Override
    public String getColumnName(int column) {
	switch (column) {
	case 0:
	    return "Regie/Rolle";
	case 1:
	    return "Text";
	default:
	    return "";
	}
    }

    @Override
    public boolean isCellEditable(int row, int column) {
	return true;
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
	return types[columnIndex];
    }

    public void addAbsatz(Absatz absatz) {
	absaetze.add(absatz);
	fireTableDataChanged();
    }

    public void refresh() {
	fireTableDataChanged();
    }

    public boolean isEmpty() {
	return absaetze.isEmpty();
    }

    public Absatz removeAbsatzAt(int rowIndex) {
	Absatz removedAbsatz = absaetze.remove(rowIndex);
	fireTableDataChanged();
	return removedAbsatz;
    }

    public void removeAbsatz(Absatz absatz) {
	absaetze.remove(absatz);
	fireTableDataChanged();
    }

    public void replaceAbsatz(Absatz oldAbsatz, Absatz newAbsatz) {
	absaetze.set(absaetze.indexOf(oldAbsatz), newAbsatz);
	fireTableDataChanged();
    }

    public Absatz getAbsatzAt(int rowIndex) {
	if (rowIndex < absaetze.size()) {
	    return absaetze.get(rowIndex);
	}
	return null;
    }
}
